/*******************************************************************************
 * FilePath    : \Software\Examples\Ble\ble_app_peripheral_uart\Src\User\AT_CMD.c
 * Version     : 1.0
 * Brief       : 
 * Author      : AndrewHu
 * Company     : Shanghai MacroGiga Electronics CO.,Ltd
 * Email       : Hubinbo@macrogiga.com
 * Date        : 2020-04-03 15:06:14
 * LastEditors : AndrewHu
 * LastEditTime: 2021-04-21 11:23:35
 * Description : 
 ******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include <Includes.h>
/* Private typedef -----------------------------------------------------------*/
typedef void (*ATCMDFUNC)(u8 *cmd /*NULL ended, leading with the cmd NAME string, checking usage*/, u8 len);
/* Private define ------------------------------------------------------------*/
#define MAX_AT_CMD_NAME_SIZE 16
#define DataType_HEX 0
#define DataType_ASCII 1
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static u8 dataType = DataType_HEX; //0-ASCII,0-HEX
/* Private function ----------------------------------------------------------*/
//info
static void atcmd_Minfo(u8 *parameter, u8 len); //系统状态信息
//MCU
static void atcmd_SetDataType(u8 *parameter, u8 len); //设置数据通讯类型，'ASCII','HEX'
static void atcmd_GetDataType(u8 *parameter, u8 len); //获取数据通讯类型，'ASCII','HEX'
static void atcmd_SetLowPower(u8 *parameter, u8 len); //省电模式，0-正常工作，1-蓝牙进入低功耗，2-整个系统进入待机状态，最低功耗
static void atcmd_GetLowPower(u8 *parameter, u8 len); //获取省电状态
static void atcmd_SetUartBaud(u8 *parameter, u8 len); //设置串口波特率
static void atcmd_GetUartBaud(u8 *parameter, u8 len); //获取串口波特率
//BLE
static void atcmd_BleUart(u8 *parameter, u8 len);             //设定蓝牙通讯为透传模式
static void atcmd_BleAtCmd(u8 *parameter, u8 len);            //设定蓝牙通讯为AT指令模式
static void atcmd_SetName(u8 *parameter, u8 len);             //设定蓝牙设备名
static void atcmd_GetName(u8 *parameter, u8 len);             //获取蓝牙设备名
static void atcmd_SetMacAddr(u8 *parameter, u8 len);          //设定蓝牙Mac地址
static void atcmd_GetMacAddr(u8 *parameter, u8 len);          //获取蓝牙Mac地址
static void atcmd_SetAdvInt(u8 *parameter, u8 len);           //设定广播间隔
static void atcmd_GetAdvInt(u8 *parameter, u8 len);           //获取广播间隔
static void atcmd_SetAdvData(u8 *parameter, u8 len);          //设定广播数据
static void atcmd_GetAdvData(u8 *parameter, u8 len);          //获取广播数据
static void atcmd_SetBleDisconnect(u8 *parameter, u8 len);    //蓝牙断开连接
static void atcmd_GetBleConnectStatus(u8 *parameter, u8 len); //蓝牙断开连接
static void atcmd_SendData(u8 *parameter, u8 len);            //发送数
static void atcmd_SetConnectInterval(u8 *parameter, u8 len);  //更新连接参数
static void atcmd_GetConnectInterval(u8 *parameter, u8 len);  //获取连接参数

/* extern --------------------------------------------------------------------*/

typedef struct _tagATCMD
{
    ATCMDFUNC func;
    u8 name[MAX_AT_CMD_NAME_SIZE]; //max len is 11 bytes
} AT_CMD_FUNC;

AT_CMD_FUNC at_func_list[] =
    {
        //info
        {atcmd_Minfo, "MINFO"},
        //MCU
        {atcmd_SetDataType, "SETDATATYPE="},
        {atcmd_GetDataType, "GETDATATYPE"},
        {atcmd_SetLowPower, "SETLPOWER="},
        {atcmd_GetLowPower, "GETLPOWER"}, //实际应用无意义
        {atcmd_SetUartBaud, "SETBAUD="},
        {atcmd_GetUartBaud, "GETBAUD"}, //实际应用无意义
        //BLE
        {atcmd_BleUart, "BLEUART"},
        {atcmd_BleAtCmd, "BLEATCMD"},
        {atcmd_SetName, "SETNAME="},
        {atcmd_GetName, "GETNAME"},
        {atcmd_SetMacAddr, "SETMAC="},
        {atcmd_GetMacAddr, "GETMAC"},
        {atcmd_SetAdvInt, "SETADVINT="},
        {atcmd_GetAdvInt, "GETADVINT"},
        {atcmd_SetAdvData, "SETADVDATA="},
        {atcmd_GetAdvData, "GETADVDATA"},
        {atcmd_SetBleDisconnect, "BLEDISC"},
        {atcmd_GetBleConnectStatus, "GETCONNECTSTAT"},
        {atcmd_SendData, "SENDDATA="},
        {atcmd_SetConnectInterval, "SETCONNINT="},
        {atcmd_GetConnectInterval, "GETCONNINT"},
};

#define at_cmd_len (sizeof(at_func_list) / sizeof(at_func_list[0])) //AT指令数

#define atcmd_Minfo_Len strlen((const char *)at_func_list[0].name)
#define atcmd_SetDataType_Len strlen((const char *)at_func_list[1].name)
#define atcmd_GetDataType_Len strlen((const char *)at_func_list[2].name)
#define atcmd_SetLowPower_Len strlen((const char *)at_func_list[3].name)
#define atcmd_GetLowPower_Len strlen((const char *)at_func_list[4].name)
#define atcmd_SetUartBaud_Len strlen((const char *)at_func_list[5].name)
#define atcmd_GetUartBaud_Len strlen((const char *)at_func_list[6].name)
#define atcmd_BleUart_Len strlen((const char *)at_func_list[7].name)
#define atcmd_BleAtCmd_Len strlen((const char *)at_func_list[8].name)
#define atcmd_SetName_Len strlen((const char *)at_func_list[9].name)
#define atcmd_GetName_Len strlen((const char *)at_func_list[10].name)
#define atcmd_SetMacAddr_Len strlen((const char *)at_func_list[11].name)
#define atcmd_GetMacAddr_Len strlen((const char *)at_func_list[12].name)
#define atcmd_SetAdvInt_Len strlen((const char *)at_func_list[13].name)
#define atcmd_GetAdvInt_Len strlen((const char *)at_func_list[14].name)
#define atcmd_SetAdvData_Len strlen((const char *)at_func_list[15].name)
#define atcmd_GetAdvData_Len strlen((const char *)at_func_list[16].name)
#define atcmd_SetBleDisconnect_Len strlen((const char *)at_func_list[17].name)
#define atcmd_GetBleConnectStatus_Len strlen((const char *)at_func_list[18].name)
#define atcmd_SendData_Len strlen((const char *)at_func_list[19].name)
#define atcmd_SetConnectInterval_Len strlen((const char *)at_func_list[20].name)
#define atcmd_GetConnectInterval_Len strlen((const char *)at_func_list[20].name)
/*******************************************************************************
 * Function    : 
 * Brief       : 设定通讯数据格式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-22 12:00:12
 * Description : 
 ******************************************************************************/
void SetDataType(u8 type)
{
    dataType = type;
}
/*******************************************************************************
 * Function    : GetDataType
 * Brief       : 获取通讯数据格式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-22 12:01:51
 * Description : 
 ******************************************************************************/
u8 GetDataType(void)
{
    return dataType;
}
/*******************************************************************************
 * Function    : IsExactData
 * Brief       : 数据比较
 * Parameter   : 
 * Returns     : 返回字符长度
 * Date        : 2020-04-06 10:24:36
 * Description : 以后一个数组的长度作为比较长度
 ******************************************************************************/
static u8 IsExactData(u8 *data, const u8 *cmd)
{
    u8 i = 0, len = strlen((const char *)cmd);

    for (i = 0; i < len; i++)
    {
        if (cmd[i] != data[i])
        {
            return 0;
        }
    }

    return len;
}
/*******************************************************************************
 * Function    : AtCmdParser
 * Brief       : AT指令模式通讯，指令比较
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 10:46:19
 * Description : 
 ******************************************************************************/
void AtCmdParser(u8 *cmd, u8 len)
{
    u8 i, j;
    if (len > 3)
    {
        if (IsExactData(cmd, (const u8 *)"AT+")) //AT+MINFO
        {
            //查找AT指令
            cmd += 3;
            len -= 3;
            for (i = 0; i < at_cmd_len; i++)
            {
                j = IsExactData(cmd, at_func_list[i].name);
                if (j)
                {
                    //found
                    //移除对应指令信息
                    cmd += j;
                    len -= j;

                    at_func_list[i].func(cmd /*including the CMD name*/, len);
                    return;
                }
            }
        }
    }
    Printf_Error(ErrorCode_NotFound); //指令错误
}
/*******************************************************************************
 * Function    : atcmd_Compare_uart2atcmd
 * Brief       : 透传模式切换为AT指令模式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 14:35:41
 * Description : 
 ******************************************************************************/
u8 atcmd_Compare_uart2atcmd(u8 *parameter, u8 len)
{
    u8 j;
    if (len > 3)
    {
        if (IsExactData(parameter, (const u8 *)"AT+")) //AT+MINFO
        {
            //查找AT指令
            parameter += 3;
            len -= 3;

            j = IsExactData(parameter, at_func_list[8].name);
            if (j)
            {
                //found
                //移除对应指令信息
                parameter += j;
                len -= j;

                at_func_list[8].func(parameter /*including the CMD name*/, len);
                return 1;
            }
        }
    }
    return 0;
}
/*******************************************************************************
 * Function    : atcmd_Minfo
 * Brief       : 获取信息
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_Minfo(u8 *parameter, u8 len)
{
    Printf_Not_Use();
}
/*******************************************************************************
 * Function    : atcmd_SetDataType
 * Brief       : 设置数据通讯类型，'ASCII','HEX'
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_SetDataType(u8 *parameter, u8 len)
{
    if (IsExactData(parameter, (const u8 *)"ASCII"))
    {
        SetDataType(DataType_ASCII);
    }
    else if (IsExactData(parameter, (const u8 *)"HEX"))
    {
        SetDataType(DataType_HEX);
    }
    else
    {
        Printf_Error(ErrorCode_NotFound);
        return;
    }
    Printf_OK();
    SetFlashFlag(FLASH_WRITE_ENABLE);
}
/*******************************************************************************
 * Function    : atcmd_GetDataType
 * Brief       : 获取数据通讯类型，'ASCII','HEX'
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetDataType(u8 *parameter, u8 len)
{
    if (GetDataType() == DataType_ASCII)
        Printf_IND_Str_NewLine((u8 *)"ASCII", 5);
    else
    {
        SetDataType(DataType_HEX);
        Printf_IND_Str_NewLine((u8 *)"HEX", 3);
    }
}
/*******************************************************************************
 * Function    : atcmd_SetLowPower
 * Brief       : 省电模式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 0-正常工作，1-蓝牙进入低功耗，2-整个系统进入待机状态，最低功耗
 ******************************************************************************/
static void atcmd_SetLowPower(u8 *parameter, u8 len)
{
    u8 i;

    i = parameter[0];
    if (GetDataType() == DataType_ASCII)
    {
        //ascii
        i = AHL_Data_Ascii2Hex(i);
    }

    switch (i)
    {
    case RunningMode_Normal:
        SetRunningMode(RunningMode_Normal);
        Printf_OK();
        break;
    case RunningMode_Sleep:
        SetRunningMode(RunningMode_Sleep);
        Printf_OK();
        break;
    case RunningMode_Stop:
        SetRunningMode(RunningMode_Stop);
        Printf_OK();
        break;
    case RunningMode_Standby:
        SetRunningMode(RunningMode_Standby);
        Printf_OK();
        break;
    default:
        Printf_Error(ErrorCode_NotFound);
        break;
    }
}
/*******************************************************************************
 * Function    : atcmd_GetLowPower
 * Brief       : 获取工作模式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 0-正常工作，1-蓝牙进入低功耗，2-关闭蓝牙功能，保持MCU运行，3-整个系统进入待机状态，最低功耗
 ******************************************************************************/
static void atcmd_GetLowPower(u8 *parameter, u8 len)
{
    u8 i = getRunningMode();
    if (GetDataType() == DataType_ASCII)
    {
        //ascii发送
        Printf_IND();
        switch (i)
        {
        case RunningMode_Normal:
            Uart_Send_String((u8 *)"\r\nNormal Mode", 13);
            break;
        case RunningMode_Sleep:
            Uart_Send_String((u8 *)"\r\nSleep Mode", 12);
            break;
        case RunningMode_Stop:
            Uart_Send_String((u8 *)"\r\nStop Mode", 11);
            break;
        case RunningMode_Standby:
            Uart_Send_String((u8 *)"\r\nStandby Mode", 14);
            break;
        default:
            Printf_Error(ErrorCode_NotFound);
            break;
        }
    }
    else
    {
        Printf_IND();
        Uart_Send_Byte(i);
        Printf_NewLine();
    }
}
/*******************************************************************************
 * Function    : atcmd_SetUartBaud
 * Brief       : 设置串口波特率
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_SetUartBaud(u8 *parameter, u8 len)
{
    Printf_Not_Use();
}
/*******************************************************************************
 * Function    : atcmd_GetUartBaud
 * Brief       : 获取串口波特率
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetUartBaud(u8 *parameter, u8 len)
{
    Printf_Not_Use();
}
/*******************************************************************************
 * Function    : atcmd_BleUart
 * Brief       : 设定蓝牙通讯为透传模式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_BleUart(u8 *parameter, u8 len)
{
    setBleMode(0);
    Printf_OK();
    SetFlashFlag(FLASH_WRITE_ENABLE);
}
/*******************************************************************************
 * Function    : atcmd_BleAtCmd
 * Brief       : 设定蓝牙通讯为AT指令模式
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_BleAtCmd(u8 *parameter, u8 len)
{
    setBleMode(1);
    Printf_OK();
    SetFlashFlag(FLASH_WRITE_ENABLE);
}
/*******************************************************************************
 * Function    : atcmd_SetName
 * Brief       : 设定蓝牙设备名
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 字符串发送，不区分HEX和ASCII
 ******************************************************************************/
static void atcmd_SetName(u8 *parameter, u8 len)
{

    if ((len > 24) || (len == 0))
    {
        Printf_Error(ErrorCode_Data);
        return;
    }
    updateDeviceInfoData(parameter, len);
    Printf_OK();
    SetFlashFlag(FLASH_WRITE_ENABLE);
}
/*******************************************************************************
 * Function    : atcmd_GetName
 * Brief       : 获取蓝牙设备名
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetName(u8 *parameter, u8 len)
{
    u8 i;
    u8 *str = getDeviceInfoData(&i);
    Printf_IND_Str_NewLine(str, i);
}
/*******************************************************************************
 * Function    : atcmd_SetMacAddr
 * Brief       : 设定蓝牙MAC地址
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 高字节在前
 ******************************************************************************/
static void atcmd_SetMacAddr(u8 *parameter, u8 len)
{
    u8 data[6];

    if (GetDataType() == DataType_HEX)
    {
        //hex
        if (len != 6)
        {
            Printf_Error(ErrorCode_Data);
        }
        else
        {
            SetBleAddr(parameter);
            SetFlashFlag(FLASH_WRITE_ENABLE);
            Printf_OK();
        }
    }
    else
    {
        //ascii
        if (len != 12)
        {
            Printf_Error(ErrorCode_Data);
        }
        else
        {
            AHL_Data_String2Arry_R(data, parameter, &len);
            SetBleAddr(data);
            SetFlashFlag(FLASH_WRITE_ENABLE);
            Printf_OK();
        }
    }
}
/*******************************************************************************
 * Function    : atcmd_GetMacAddr
 * Brief       : 获取蓝牙MAC地址
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetMacAddr(u8 *parameter, u8 len)
{
    u8 *addr = getBleAddr();
    if (GetDataType() == DataType_HEX)
    {
        //hex
        Printf_IND();
        Uart_Send_String(addr, 6);
        Printf_NewLine();
    }
    else
    {
        //ascii
        Printf_IND();
        Uart_Send_Array2Ascii_R(addr, 6, 0);
        Printf_NewLine();
    }
}
/*******************************************************************************
 * Function    : atcmd_SetAdvInt
 * Brief       : 设定广播间隔
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 0x0020~0x4000, unit 0.625ms
 ******************************************************************************/
static void atcmd_SetAdvInt(u8 *parameter, u8 len)
{
    u16 temp = 0;
    u8 data[2];
    if (GetDataType() == DataType_ASCII)
    {
        //ascii
        if (len > 4)
        {
            Printf_Error(ErrorCode_Data);
            return;
        }
        AHL_Data_String2Arry(data, parameter, &len);
    }
    else
    {
        //hex
        data[0] = parameter[0];
        data[1] = parameter[1];
    }

    if (len == 2)
    {
        temp = data[0];
        temp <<= 8;
        temp |= data[1];
    }
    else if (len == 1)
    {
        temp = data[0];
    }
    else
    {
        Printf_Error(ErrorCode_Data);
        return;
    }

    if ((temp < 0x20) || (temp > 0x4000))
    {
        Printf_Error(ErrorCode_Data);
        return;
    }
    ble_set_interval(temp);
    SetBleAdvInterval(temp);
    SetFlashFlag(FLASH_WRITE_ENABLE);
    Printf_OK();
}
/*******************************************************************************
 * Function    : atcmd_GetAdvInt
 * Brief       : 获取广播间隔
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetAdvInt(u8 *parameter, u8 len)
{
    Printf_Not_Use();
}
/*******************************************************************************
 * Function    : atcmd_SetAdvData
 * Brief       : 设定广播内容
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_SetAdvData(u8 *parameter, u8 len)
{
    u8 advdata[31];

    if (GetDataType() == DataType_ASCII)
    {
        //ascii
        if (len > 62)
        {
            Printf_Error(ErrorCode_Data);
            return;
        }
        else
            AHL_Data_String2Arry(advdata, parameter, &len); //字符串转为数组
    }
    else
    {
        //hex
        if (len > 31)
        {
            Printf_Error(ErrorCode_Data);
            return;
        }
        else
            memcpy(advdata, parameter, len);
    }

    SetAdvData(advdata, len);
    SetFlashFlag(FLASH_WRITE_ENABLE);
    Printf_OK();
}
/*******************************************************************************
 * Function    : atcmd_GetAdvData
 * Brief       : 
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetAdvData(u8 *parameter, u8 len)
{
    Printf_Not_Use();
}
/*******************************************************************************
 * Function    : atcmd_SetBleDisconnect
 * Brief       : 断开蓝牙连接
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_SetBleDisconnect(u8 *parameter, u8 len)
{
    if (GetConnectedStatus())
    {
        ble_disconnect();
        Printf_OK();
    }
    else
    {
        Printf_ConnectStatus(0);
    }
}
/*******************************************************************************
 * Function    : atcmd_GetBleConnectStatus
 * Brief       : 获取蓝牙连接状态
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_GetBleConnectStatus(u8 *parameter, u8 len)
{
    Printf_ConnectStatus(GetConnectedStatus());
}
/*******************************************************************************
 * Function    : atcmd_SendData
 * Brief       : 发送数据
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 12:08:28
 * Description : 
 ******************************************************************************/
static void atcmd_SendData(u8 *parameter, u8 len)
{
    u8 data[20], length = 0;
    if (GetConnectedStatus() == 0)
    {
        Printf_ConnectStatus(0);
        return;
    }

    if (GetDataType() == DataType_ASCII)
    {
        //ascii
        while (len >= 20)
        {
            length = 20;
            len -= 20;
            AHL_Data_String2Arry(data, parameter, &length); //字符串转为数组
            SendNotifyData(data, length);
            parameter += 20;
        }
        if (len != 0)
        {
            AHL_Data_String2Arry(data, parameter, &len); //字符串转为数组
            SendNotifyData(data, len);
        }
    }
    else
    {
        //hex
        SendNotifyData(parameter, len);
    }

    Printf_OK();
}
/*******************************************************************************
 * Function    : BleRxData
 * Brief       : 蓝牙收到主机数据，串口发出
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-06 20:24:10
 * Description : 
 ******************************************************************************/
void BleRxData(u8 *parameter, u8 len)
{
    if (getBleMode())
    {
        //AT指令
        Uart_Send_String((u8 *)"\r\nRxData:", 9);
    }

    if (GetDataType() == DataType_HEX)
    {
        //hex,"AT_SENDDATA=1312",实际传输数据为0x31333132
        Uart_Send_String(parameter, len);
    }
    else
    {
        //ascii,"AT_SENDDATA=1312",实际传输数据为0x1312
        Uart_Send_Array2Ascii(parameter, len, 0);
    }
}
/*******************************************************************************
 * Function    : atcmd_SetConnectInterval
 * Brief       : 设定连接参数
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-07 19:43:08
 * Description : 
 * Interval Max * (Slave Latency + 1) <= 2 s
 * Interval Max >= 20 ms
 * Interval Min + 20 ms <= Interval Max
 * Slave Latency <= 4
 * ConnSupervisionTimeout <= 6 s
 * Interval Max * ( Slave Latency + 1) * 3 < ConnSupervisionTimeout
 ******************************************************************************/
void atcmd_SetConnectInterval(u8 *parameter, u8 len)
{
    if (GetConnectedStatus() == 0)
    {
        Printf_ConnectStatus(0);
        return;
    }

    if (len != 1)
    {
        Printf_Error(ErrorCode_Data);
        return;
    }

    if (parameter[0] == '1')
    {
        //连接间隔短,30ms
        SIG_ConnParaUpdateReq(24, 24, 0x0000, 400);
    }
    else if (parameter[0] == '2')
    {
        //连接间隔中等,100ms
        SIG_ConnParaUpdateReq(80, 80, 0x0000, 400);
    }
    else if (parameter[0] == '3')
    {
        //连接间隔中等,500ms
        SIG_ConnParaUpdateReq(400, 400, 0x0000, 400);
    }
    else if (parameter[0] == '4')
    {
        //连接间隔长，省电，速度响应慢,1s
        SIG_ConnParaUpdateReq(800, 800, 0x0000, 400);
    }
    else
    {
        //
        Printf_Error(ErrorCode_Data);
        return;
    }
    Printf_OK();
}
/*******************************************************************************
 * Function    : atcmd_GetConnectInterval
 * Brief       : 获取连接参数
 * Parameter   : 
 * Returns     : 
 * Date        : 2020-04-07 21:54:56
 * Description : 
 ******************************************************************************/
void atcmd_GetConnectInterval(u8 *parameter, u8 len)
{
    u16 conn_interv = sconn_GetConnInterval();
    if (GetConnectedStatus() == 0)
    {
        Printf_ConnectStatus(0);
        return;
    }

    if (GetDataType() == DataType_ASCII)
    {
        //ascii
        Uart_Send_Byte2Ascii(conn_interv >> 8);
        Uart_Send_Byte2Ascii(conn_interv & 0x00ff);
    }
    else
    {
        //hex
        Uart_Send_Byte(conn_interv >> 8);
        Uart_Send_Byte(conn_interv & 0x00ff);
    }
}
